μΉ μ ν리μΌμ΄μ μ 곡μ λμμΌλ‘ λ±λ‘νμ¬ νλ«νΌ μ λ°μ μ¬μ©μ κ²½νκ³Ό μ± μ°Έμ¬λλ₯Ό ν₯μμν€λ Web Share Target APIμ λν΄ μμ보μΈμ.
Web Share Target API: λκΉ μλ 곡μ λ₯Ό μν μ± λ±λ‘ νμ±ν
Web Share Target APIλ νλ‘κ·Έλ μλΈ μΉ μ±(PWA)μ΄ κ³΅μ λμμΌλ‘ λ±λ‘λ μ μλλ‘ νμ¬ μ¬μ©μ κΈ°κΈ°μμ μΌκΈ μλ―Ό(first-class citizen)μ΄ λλλ‘ ν©λλ€. μ΄λ μ¬μ©μκ° λ€λ₯Έ μ±μ΄λ μΉμ¬μ΄νΈμ μ½ν μΈ λ₯Ό 곡μ νκΈ°λ‘ μ ννμ λ, μ¬λ¬λΆμ PWAκ° κ³΅μ μνΈμ μ΅μ μΌλ‘ λνλ λκΉ μκ³ ν΅ν©λ 곡μ κ²½νμ μ 곡ν μ μμμ μλ―Έν©λλ€.
Web Share Target API μ΄ν΄νκΈ°
μ ν΅μ μΌλ‘ μΉ μ ν리μΌμ΄μ μ λ€μ΄ν°λΈ 곡μ λ©μ»€λμ¦κ³Ό λ€μ λΆλ¦¬λμ΄ μμμ΅λλ€. μΉ μ±μ΄ λ€μ΄ν°λΈ 곡μ λν μμλ₯Ό μ€νν μ μκ² ν΄μ£Όλ Web Share APIλ μ€μν μ§μ μ΄μμ΅λλ€. νμ§λ§ Web Share Target APIλ ν κ±Έμ λ λμκ° μΉ μ±μ΄ 곡μ λ μ½ν μΈ λ₯Ό μ§μ *μμ *ν μ μκ² ν©λλ€.
μ΄λ κ² μκ°ν΄λ³΄μΈμ: Web Share APIλ μΉ μ±μ΄ 곡μ λ₯Ό μμνλ κ²κ³Ό κ°κ³ , Web Share Target APIλ μΉ μ±μ΄ 곡μ μ λμμ΄ λλ κ²κ³Ό κ°μ΅λλ€.
Web Share Target APIλ₯Ό μ¬μ©ν΄μΌ νλ μ΄μ
- ν₯μλ μ¬μ©μ κ²½ν: μ¬μ©μμκ² λμ± ν΅ν©λκ³ λ€μ΄ν°λΈμ κ°μ 곡μ κ²½νμ μ 곡ν©λλ€. λ§ν¬λ₯Ό 볡μ¬νμ¬ λΆμ¬λ£κ±°λ μ½ν μΈ λ₯Ό μλμΌλ‘ κ°μ Έμ€λ λμ , μ¬μ©μλ ν λ²μ νμΌλ‘ PWAμ μ§μ 곡μ ν μ μμ΅λλ€.
- μ± μ°Έμ¬λ μ¦κ°: PWAλ₯Ό λ μ κ·ΌνκΈ° μ½κ³ μ μ©νκ² λ§λ€μ΄ μ¬μ©μκ° λ μμ£Ό μνΈμμ©νλλ‘ μ₯λ €ν©λλ€. μ¬μ©μκ° λ©λͺ¨ μμ± PWAμ μ§μ λ§ν¬λ₯Ό 곡μ νκ±°λ μ¬μ§ νΈμ§ PWAμ μ΄λ―Έμ§λ₯Ό 곡μ νλ κ²μ μμν΄λ³΄μΈμ.
- λ°κ²¬ κ°λ₯μ± ν₯μ: μ¬μ©μκ° PWAλ₯Ό μ€ν κ°λ₯ν 곡μ μ΅μ μΌλ‘ λ°κ²¬νλλ‘ λμ μ κ· μ¬μ©μ νλ³΄λ‘ μ΄μ΄μ§ μ μμ΅λλ€.
- ν¬λ‘μ€ νλ«νΌ νΈνμ±: Web Share Target APIλ λ€μν μ΄μ체μ μ λΈλΌμ°μ μμ μλνλλ‘ μ€κ³λμ΄ λͺ¨λ μ¬μ©μμκ² μΌκ΄λ 곡μ κ²½νμ μ 곡ν©λλ€. νλ«νΌλ³ 곡μ λ©μ»€λμ¦μ 볡μ‘μ±μ μΆμνν©λλ€.
Web Share Target API ꡬν λ°©λ²
Web Share Target APIλ₯Ό ꡬννλ €λ©΄ PWAμ λ§€λνμ€νΈ νμΌμ μμ νκ³ λ€μ΄μ€λ 곡μ λ°μ΄ν°λ₯Ό μ²λ¦¬ν μλΉμ€ μ컀λ₯Ό μμ±ν΄μΌ ν©λλ€.
1. λ§€λνμ€νΈ νμΌ μμ (manifest.json)
`manifest.json` νμΌμ λͺ¨λ PWAμ ν΅μ¬μ λλ€. μ¬κΈ°μλ μ ν리μΌμ΄μ μ μ΄λ¦, μμ΄μ½, κ·Έλ¦¬κ³ μ΄ κ²½μ°μλ 곡μ λμ κΈ°λ₯κ³Ό κ°μ λ©νλ°μ΄ν°κ° ν¬ν¨λ©λλ€. λ§€λνμ€νΈμ `share_target` μμ±μ μΆκ°ν΄μΌ ν©λλ€.
κΈ°λ³Έ μμλ λ€μκ³Ό κ°μ΅λλ€:
{
"name": "My Awesome PWA",
"short_name": "Awesome PWA",
"icons": [
{
"src": "/images/icon-192x192.png",
"sizes": "192x192",
"type": "image/png"
}
],
"start_url": "/",
"display": "standalone",
"background_color": "#ffffff",
"theme_color": "#000000",
"share_target": {
"action": "/share-target/",
"method": "POST",
"enctype": "multipart/form-data",
"params": {
"title": "title",
"text": "text",
"url": "url",
"files": [
{
"name": "file",
"accept": ["image/*", "video/*"]
}
]
}
}
}
`share_target` μμ±μ μμΈν μ΄ν΄λ³΄κ² μ΅λλ€:
- `action`: 곡μ λ λ°μ΄ν°λ₯Ό μ²λ¦¬ν URLμ λλ€. PWA λ΄μμ λ€μ΄μ€λ λ°μ΄ν°λ₯Ό μ²λ¦¬ν μ μλλ‘ κ°μΆ°μ§ νμ΄μ§μ¬μΌ ν©λλ€. μ΄ νμ΄μ§λ μΌλ°μ μΌλ‘ μ무κ²λ μ§μ λ λλ§νμ§ μκ³ , λμ μλ°μ€ν¬λ¦½νΈλ₯Ό μ¬μ©νμ¬ λ°μ΄ν°λ₯Ό μ²λ¦¬νκ³ μ¬μ©μλ₯Ό μ±μ μ μ ν λ·°λ‘ λ¦¬λλ μ ν μ μμ΅λλ€. μ: `/share-target/`
- `method`: λ°μ΄ν°λ₯Ό μ μ‘νλ λ° μ¬μ©λλ HTTP λ©μλμ λλ€. νΉν νμΌμ λ€λ£° λλ `POST`κ° μΌλ°μ μΌλ‘ κΆμ₯λ©λλ€.
- `enctype`: λ°μ΄ν°μ μΈμ½λ© μ νμ λλ€. `multipart/form-data`λ νμΌ μ²λ¦¬μ μ ν©νλ©°, `application/x-www-form-urlencoded`λ λ κ°λ¨ν ν μ€νΈ κΈ°λ° λ°μ΄ν°μ μ¬μ©ν μ μμ΅λλ€.
- `params`: 곡μ λ λ°μ΄ν°κ° νΌ νλμ μ΄λ»κ² λ§€νλλμ§λ₯Ό μ μν©λλ€.
- `title`: 곡μ λ μ λͺ©μ λ°μ νΌ νλμ μ΄λ¦μ λλ€.
- `text`: 곡μ λ ν μ€νΈλ₯Ό λ°μ νΌ νλμ μ΄λ¦μ λλ€.
- `url`: 곡μ λ URLμ λ°μ νΌ νλμ μ΄λ¦μ λλ€.
- `files`: κ° νμΌ νλλ₯Ό μ μνλ κ°μ²΄μ λ°°μ΄μ λλ€.
- `name`: νμΌμ μν νΌ νλμ μ΄λ¦μ λλ€.
- `accept`: νμΌ νλκ° νμ©νλ MIME μ νμ λ°°μ΄μ λλ€.
`application/x-www-form-urlencoded`λ₯Ό μ¬μ©ν λ체 `params` ꡬμ±:
{
"action": "/share-target/",
"method": "GET",
"params": {
"title": "shared_title",
"text": "shared_text",
"url": "shared_url"
}
}
μ΄ κ΅¬μ±μμλ 곡μ λ λ°μ΄ν°κ° 쿼리 λ§€κ°λ³μλ‘ `action` URLμ μΆκ°λ©λλ€(μ: `/share-target/?shared_title=...&shared_text=...&shared_url=...`). μ΄ μ κ·Ό λ°©μμ μ£Όλ‘ ν μ€νΈ κΈ°λ° λ°μ΄ν°λ₯Ό λ€λ£¨λ κ°λ¨ν μλ리μ€μ μ ν©ν©λλ€.
2. μλΉμ€ μ컀μμ 곡μ λ°μ΄ν° μ²λ¦¬νκΈ°
μλΉμ€ μ컀λ μΉ νμ΄μ§μ λ³λλ‘ λ°±κ·ΈλΌμ΄λμμ μ€νλλ μ€ν¬λ¦½νΈμ λλ€. λ€νΈμν¬ μμ²μ κ°λ‘μ±κ³ , 리μμ€λ₯Ό μΊμνλ©°, μ΄ κ²½μ°μλ λ€μ΄μ€λ 곡μ λ°μ΄ν°λ₯Ό μ²λ¦¬ν μ μμ΅λλ€.
μλΉμ€ μ컀μμ `fetch` μ΄λ²€νΈλ₯Ό μμ νκ³ μμ² URLμ΄ λ§€λνμ€νΈμ μ μλ `action` URLκ³Ό μΌμΉνλμ§ νμΈν΄μΌ ν©λλ€. μΌμΉνλ€λ©΄ 곡μ λ λ°μ΄ν°λ₯Ό μ²λ¦¬νκ³ μ¬μ©μλ₯Ό PWAμ μ μ ν λ·°λ‘ λ¦¬λλ μ ν μ μμ΅λλ€.
λ€μμ μλΉμ€ μ컀 μ½λ μ€λν« μμμ λλ€ (service-worker.js):
self.addEventListener('fetch', event => {
if (event.request.method === 'POST' && event.request.url.includes('/share-target/')) {
event.respondWith(async function() {
const formData = await event.request.formData();
const title = formData.get('title');
const text = formData.get('text');
const url = formData.get('url');
const file = formData.get('file');
// 곡μ λ°μ΄ν° μ²λ¦¬ (μ: λ°μ΄ν°λ² μ΄μ€μ μ μ₯, UIμ νμ)
console.log('곡μ λ λ°μ΄ν°:', { title, text, url, file });
// μμ: 곡μ λ°μ΄ν°λ₯Ό localStorageμ μ μ₯νκ³ λ¦¬λλ μ
const shareData = {
title: title || '',
text: text || '',
url: url || '',
file: file ? file.name : '' // λ¨μνλ₯Ό μν΄ νμΌ μ΄λ¦λ§ μ μ₯
};
localStorage.setItem('sharedData', JSON.stringify(shareData));
// 곡μ λ μ½ν
μΈ λ₯Ό νμνκΈ° μν΄ νΉμ νμ΄μ§λ‘ 리λλ μ
return Response.redirect('/shared-content/', 303);
//볡μ‘ν νμΌ μ²λ¦¬λ₯Ό μν λμ:
//if (file) {
// // νμΌμ BlobμΌλ‘ λ³ννμ¬ IndexedDBμ μ μ₯νκ±°λ μλ²λ‘ μ μ‘ν©λλ€.
// const blob = await file.blob();
// // ... (IndexedDB μ½λ λλ μ
λ‘λ μλν¬μΈνΈλ‘ fetch)
//}
}());
}
});
μλΉμ€ μ컀 ꡬν μ μ€μ κ³ λ €μ¬ν:
- νμΌ μ²λ¦¬: μ μμ λ 곡μ λ νμΌμ μ κ·Όνλ κΈ°λ³Έμ μΈ λ°©λ²μ μ 곡ν©λλ€. λ 볡μ‘ν μλ리μ€μ κ²½μ°, νμΌμ BlobμΌλ‘ λ³ννμ¬ IndexedDBμ μ μ₯νκ±°λ μλ²μ μ λ‘λν΄μΌ ν©λλ€. 곡μ λλ νμΌμ ν¬κΈ°λ₯Ό κ³ λ €νκ³ μ μ ν μ€λ₯ μ²λ¦¬ λ° μ§νλ₯ νμκΈ°λ₯Ό ꡬννμΈμ.
- μ€λ₯ μ²λ¦¬: 곡μ λ λ°μ΄ν°κ° λλ½λμκ±°λ μ ν¨νμ§ μμ κ²½μ°λ₯Ό μ μμ μΌλ‘ μ²λ¦¬ν μ μλλ‘ κ°λ ₯ν μ€λ₯ μ²λ¦¬λ₯Ό ꡬννμΈμ. μ¬μ©μ μΉνμ μΈ μ€λ₯ λ©μμ§λ₯Ό νμνκ³ λ¬Έμ ν΄κ²° λ°©λ²μ λν μ§μΉ¨μ μ 곡νμΈμ.
- 보μ: 곡μ λ°μ΄ν°λ₯Ό μ²λ¦¬ν λ 보μμ λ―ΈμΉλ μν₯μ μΌλμ λμΈμ. μ¬μ©μ μ λ ₯μ μ΄κ· νμ¬ ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν (XSS) μ·¨μ½μ μ λ°©μ§νμΈμ. μ μμ μΈ μ λ‘λλ₯Ό λ°©μ§νκΈ° μν΄ νμΌ μ νμ κ²μ¦νμΈμ.
- μ¬μ©μ κ²½ν: μ¬μ©μκ° PWAμ μ½ν μΈ λ₯Ό 곡μ ν ν λͺ νν νΌλλ°±μ μ 곡νμΈμ. μ±κ³΅ λ©μμ§λ₯Ό νμνκ±°λ 곡μ λ μ½ν μΈ λ₯Ό 보거λ νΈμ§ν μ μλ νμ΄μ§λ‘ 리λλ μ νμΈμ.
- λ°±κ·ΈλΌμ΄λ μ²λ¦¬: λμ©λ νμΌμ΄λ λ 볡μ‘ν μ²λ¦¬μ κ²½μ° Background Fetch APIλ₯Ό μ¬μ©νμ¬ λ©μΈ μ€λ λλ₯Ό μ°¨λ¨νμ§ μκ³ μνν μ¬μ©μ κ²½νμ 보μ₯νλ κ²μ κ³ λ €νμΈμ.
3. μλΉμ€ μ컀 λ±λ‘νκΈ°
λ©μΈ μλ°μ€ν¬λ¦½νΈ νμΌμ μλΉμ€ μμ»€κ° μ¬λ°λ₯΄κ² λ±λ‘λμλμ§ νμΈνμΈμ. μ΄λ μΌλ°μ μΌλ‘ λΈλΌμ°μ κ° μλΉμ€ μ컀λ₯Ό μ§μνλμ§ νμΈν λ€μ `service-worker.js` νμΌμ λ±λ‘νλ κ³Όμ μ ν¬ν¨ν©λλ€.
if ('serviceWorker' in navigator) {
navigator.serviceWorker.register('/service-worker.js')
.then(registration => {
console.log('μλΉμ€ μμ»€κ° λ€μ λ²μλ‘ λ±λ‘λμμ΅λλ€:', registration.scope);
})
.catch(error => {
console.error('μλΉμ€ μ컀 λ±λ‘μ μ€ν¨νμ΅λλ€:', error);
});
}
4. 곡μ λ μ½ν μΈ νμνκΈ°
μ μμ μμ μλΉμ€ μ컀λ `/shared-content/`λ‘ λ¦¬λλ μ ν©λλ€. μ΄ νμ΄μ§λ₯Ό λ§λ€κ±°λ 리λλ μ URLμ μ μ ν μ‘°μ νκ³ , 곡μ λ μ½ν μΈ λ₯Ό κ²μνκ³ νμνλ λ‘μ§μ ꡬνν΄μΌ ν©λλ€. μ΄λ μΌλ°μ μΌλ‘ (μμ μμμ²λΌ) `localStorage`μμ λ°μ΄ν°λ₯Ό κ²μνκ±°λ, λ°μ΄ν°λ₯Ό μꡬ μ μ₯ν κ²½μ° λ°μ΄ν°λ² μ΄μ€μμ κ²μνλ μμ μ ν¬ν¨ν©λλ€.
HTMLμμ 곡μ λ μ½ν μΈ λ₯Ό νμνλ κ°λ¨ν μλ λ€μκ³Ό κ°μ΅λλ€:
곡μ λ μ½ν
μΈ
곡μ λ μ½ν
μΈ
κ³ κΈ κ³ λ €μ¬ν λ° λͺ¨λ² μ¬λ‘
- κΈ°λ₯ κ°μ§: Web Share Target APIλ₯Ό μ¬μ©νκΈ° μ μ νμ μ¬μ©μμ λΈλΌμ°μ μμ μ§μλλμ§ νμΈνμΈμ. λ€μ μ½λ μ€λν«μ μ¬μ©νμ¬ μ§μ μ¬λΆλ₯Ό κ°μ§ν μ μμ΅λλ€:
if ('shareTarget' in navigator) {
// Web Share Target API μ§μλ¨
} else {
// Web Share Target API μ§μλμ§ μμ
}
Web Share Target API μ€μ μ¬μ© μμ
- λ©λͺ¨ μ±: μ¬μ©μλ ν μ€νΈ μ‘°κ°μ΄λ μΉ νμ΄μ§λ₯Ό λ©λͺ¨ μμ± PWAμ μ§μ 곡μ νμ¬ μ 보λ₯Ό λΉ λ₯΄κ² μ μ₯ν μ μμ΅λλ€. μλ₯Ό λ€μ΄, νλ‘μ νΈλ₯Ό μν΄ μ‘°μ¬νλ νμμ κ΄λ ¨ κΈ°μ¬λ₯Ό λμ€μ κ²ν νκΈ° μν΄ λ©λͺ¨ μ±μ μ§μ 곡μ ν μ μμ΅λλ€.
- μ¬μ§ νΈμ§ μ±: μ¬μ©μλ κ°€λ¬λ¦¬μμ μ¬μ§ νΈμ§ PWAλ‘ μ§μ μ΄λ―Έμ§λ₯Ό 곡μ νμ¬ κ°μ νκ±°λ μμ ν μ μμ΅λλ€. μ¬μ§μκ°λ ν΄λΌμ°λ μ μ₯ μλΉμ€μ μ¬μ§μ μμ μ΄ μ νΈνλ νΈμ§ μ±μΌλ‘ λΉ λ₯΄κ² 곡μ νμ¬ νλ° μμ μ ν μ μμ΅λλ€.
- μμ λ―Έλμ΄ μ±: μ¬μ©μλ λ€λ₯Έ μΉμ¬μ΄νΈλ μ±μ μ½ν μΈ λ₯Ό μμ λ―Έλμ΄ PWAμ μ§μ 곡μ νμ¬ νλ‘μμ λλ μ μμ΅λλ€. μΈν루μΈμλ μΈκΈ° μλ κΈ°μ¬λ₯Ό μμ μ μμ λ―Έλμ΄ νλ«νΌμ μ§μ 곡μ νμ¬ μ²μ€μ μ°Έμ¬λ₯Ό μ λν μ μμ΅λλ€.
- μμ°μ± μ±: νμΌ μ μ₯ μ±μ΄λ μ΄λ©μΌ ν΄λΌμ΄μΈνΈμμ λ¬Έμ, μ€νλ λμνΈ, νλ μ ν μ΄μ μ μμ°μ± PWAλ‘ μ§μ 곡μ νμ¬ νΈμ§νκ³ νμ ν μ μμ΅λλ€. νλ‘μ νΈ κ΄λ¦¬μλ μ€μκ° νΌλλ°±μ λ°κΈ° μν΄ λ¬Έμλ₯Ό ν νμ PWAμ 곡μ ν μ μμ΅λλ€.
- μ μμκ±°λ μ±: μ¬μ©μλ λ€λ₯Έ μΉμ¬μ΄νΈμ μν νμ΄μ§λ₯Ό μ μμκ±°λ PWAμ μ§μ 곡μ νμ¬ μμ리μ€νΈμ μΆκ°νκ±°λ μΉκ΅¬λ€κ³Ό 곡μ ν μ μμ΅λλ€. μΌνκ°μ λ§μμ λλ μνμ μΉκ΅¬λ€κ³Ό 곡μ νμ¬ μ견μ λ¬Όμ μ μμ΅λλ€.
μΌλ°μ μΈ λ¬Έμ ν΄κ²°
- PWAκ° κ³΅μ μνΈμ λνλμ§ μμ:
- `manifest.json` νμΌμ΄ `share_target` μμ±μΌλ‘ μ¬λ°λ₯΄κ² ꡬμ±λμλμ§ νμΈνμΈμ.
- μλΉμ€ μμ»€κ° μ λλ‘ λ±λ‘λκ³ μ€ν μ€μΈμ§ νμΈνμΈμ.
- μ½μμμ μλΉμ€ μ컀 λλ λ§€λνμ€νΈ νμΌκ³Ό κ΄λ ¨λ μ€λ₯κ° μλμ§ νμΈνμΈμ.
- λΈλΌμ°μ μΊμλ₯Ό μ§μ°κ³ λ€μ μλνμΈμ.
- 곡μ λ λ°μ΄ν°κ° μμ λμ§ μμ:
- `manifest.json` νμΌμ `action` URLμ΄ μλΉμ€ μμ»€κ° μμ λκΈ°νλ URLκ³Ό μΌμΉνλμ§ νμΈνμΈμ.
- λΈλΌμ°μ κ°λ°μ λꡬμμ λ€νΈμν¬ μμ²μ κ²μ¬νμ¬ μ μ‘λλ λ°μ΄ν°λ₯Ό νμΈνμΈμ.
- `manifest.json` νμΌμ νΌ νλ μ΄λ¦μ λ€μ νμΈνκ³ , μλΉμ€ μ컀μμ λ°μ΄ν°μ μ κ·Όνλ λ° μ¬μ©λλ μ΄λ¦κ³Ό μΌμΉνλμ§ νμΈνμΈμ.
- νμΌ κ³΅μ λ¬Έμ :
- νμΌ κ³΅μ μ `manifest.json` νμΌμ `enctype` μμ±μ΄ `multipart/form-data`λ‘ μ€μ λμ΄ μλμ§ νμΈνμΈμ.
- `manifest.json` νμΌμ `accept` μμ±μ νμΈνμ¬ μ§μνλ €λ νμΌμ MIME μ νμ΄ ν¬ν¨λμ΄ μλμ§ νμΈνμΈμ.
- νμΌ ν¬κΈ° μ νμ μ μνκ³ λμ©λ νμΌμ λν μ μ ν μ€λ₯ μ²λ¦¬λ₯Ό ꡬννμΈμ.
μΉ κ³΅μ μ λ―Έλ
Web Share Target APIλ μΉκ³Ό λ€μ΄ν°λΈ μ ν리μΌμ΄μ κ°μ 격차λ₯Ό ν΄μνλ μ€μν λ¨κ³μ λλ€. PWAκ° κ³μ λ°μ νκ³ μ¬μ©μ μν¬νλ‘μ λμ± ν΅ν©λ¨μ λ°λΌ, μΉ μ±μΌλ‘ μ½ν μΈ λ₯Ό μννκ² κ³΅μ νκ³ μΉ μ±μμ μ½ν μΈ λ₯Ό 곡μ νλ κΈ°λ₯μ μ μ λ μ€μν΄μ§ κ²μ λλ€.
μΉ κ³΅μ μ λ―Έλλ λ€μκ³Ό κ°μ λ΄μ©μ ν¬ν¨ν κ²μ λλ€:
- 보μ κ°ν: μ μ± μ½ν μΈ λ‘λΆν° 보νΈνκ³ ν¬λ‘μ€ μ¬μ΄νΈ μ€ν¬λ¦½ν (XSS) μ·¨μ½μ μ λ°©μ§νκΈ° μν λμ± κ°λ ₯ν 보μ μ‘°μΉ.
- νμΌ μ²λ¦¬ κ°μ : λμ©λ νμΌ λ° λ³΅μ‘ν λ°μ΄ν° ꡬ쑰λ₯Ό μ²λ¦¬νκΈ° μν λ ν¨μ¨μ μ΄κ³ κ°μνλ λ°©λ².
- λ€μ΄ν°λΈ APIμμ λ κΉμ ν΅ν©: λ€μ΄ν°λΈ κΈ°κΈ° κΈ°λ₯ λ° APIμμ μνν ν΅ν©μΌλ‘ λμ± λͺ°μ κ° μκ³ λ€μ΄ν°λΈμ κ°μ 곡μ κ²½ν μ 곡.
- νμ€ν: Web Share Target APIλ₯Ό νμ€ννκ³ λ€μν λΈλΌμ°μ μ νλ«νΌμμ μΌκ΄λ ꡬνμ 보μ₯νκΈ° μν μ§μμ μΈ λ Έλ ₯.
κ²°λ‘
Web Share Target APIλ μ¬μ©μ κ²½νμ ν₯μμν€κ³ νλ‘κ·Έλ μλΈ μΉ μ±κ³Όμ μ°Έμ¬λλ₯Ό λμ΄λ κ°λ ₯ν λꡬμ λλ€. PWAλ₯Ό 곡μ λμμΌλ‘ λ±λ‘ν μ μκ² ν¨μΌλ‘μ¨ μ¬μ©μμκ² λκΉ μκ³ ν΅ν©λ 곡μ κ²½νμ μ 곡νμ¬ μ±μ λ μ κ·ΌνκΈ° μ½κ³ , μ μ©νλ©°, λ°κ²¬νκΈ° μ½κ² λ§λ€ μ μμ΅λλ€.
μ΄ κ°μ΄λμ μ€λͺ λ λ¨κ³λ₯Ό λ°λ₯΄λ©΄ PWAμ Web Share Target APIλ₯Ό μ±κ³΅μ μΌλ‘ ꡬννκ³ μΉ κ³΅μ μ λͺ¨λ μ μ¬λ ₯μ λ°νν μ μμ΅λλ€.
Web Share Target APIλ₯Ό ꡬνν λ μ¬μ©μ κ²½ν, 보μ, μ±λ₯μ μ°μ μνμ¬ PWAκ° λͺ¨λ μ¬μ©μμκ² μννκ³ μ¦κ±°μ΄ 곡μ κ²½νμ μ 곡νλλ‘ ν΄μΌ ν©λλ€.